Наша задача научить самостоятельно рисовать пункты меню. Для того, чтобы это стало возможно у нас есть свойство OwnerDraw:
public bool OwnerDraw {get; set;}
Установка его в true говорит о том, что мы сами отвечаем за прорисовку пункты меню. Смотрим пример:
using System;
using System.Windows.Forms;
using System.Drawing;
class MyMenuItem : MenuItem
{
public MyMenuItem( string text, EventHandler onClick): base(text, onClick)
{
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem(e);
Graphics g = e.Graphics;
Rectangle l = e.Bounds;
l.Width=l.Width-1;
l.Height=l.Height-1;
Pen p = new Pen(Color.Blue);
g.DrawRectangle(p,l);
}
protected override void OnMeasureItem(MeasureItemEventArgs e)
{
base.OnMeasureItem(e);
e.ItemHeight = 18;
}
}
class MainForm : Form
{
MenuItem MenuNew;
public MainForm()
{
Text = "Easy Draw";
MainMenu mnuMenu = new MainMenu();
this.Menu = mnuMenu;
MenuItem MenuItemFile = new MenuItem("&File");
MenuNew = new MenuItem("New");
MenuItem MenuOpen = new MenuItem("Open");
MyMenuItem MenuExit = new MyMenuItem("Exit",
new System.EventHandler(this.MenuExit_Click));
MenuExit.OwnerDraw=true;
MenuItemFile.MenuItems.Add(MenuNew);
MenuItemFile.MenuItems.Add(MenuOpen);
MenuItemFile.MenuItems.Add(MenuExit);
mnuMenu.MenuItems.Add(MenuItemFile);
}
private void MenuExit_Click(Object sender, EventArgs e)
{
MessageBox.Show("Exit");
}
public static void Main(string[] args)
{
Application.Run(new MainForm());
}
}
Так как мы сами отвечаем за прорисовку меню нам нужно создать свой класс как наследник от MenuItem и в нем перегрузить две функции
protected virtual void OnDrawItem( DrawItemEventArgs e); protected virtual void OnMeasureItem( MeasureItemEventArgs e);
OnDrawItem отвечает за прорисовку элемента меню, а OnMeasureItem за установку размеров. А вот результат:
